﻿//using Microsoft.AspNetCore.Authorization;
//using Microsoft.AspNetCore.DataProtection;
//using Microsoft.AspNetCore.Mvc;
//using Microsoft.IdentityModel.JsonWebTokens;
//using Microsoft.IdentityModel.Tokens;
//using RuoVea.ExIdGen;
//using RuoVea.ExJwtBearer;
//using RuoVea.OAuthServer;
//using System.IdentityModel.Tokens.Jwt;
//using System.Security.Claims;
//using System.Security.Cryptography;
//using System.Text;
//using System.Text.Json;
//using System.Web;

//namespace OAuthServer.Controllers;

//public class OAuthController : Controller
//{
//    private static readonly RSA key = RSA.Create();
//    private readonly IJwtHelper _jwtHelper;
//    public IDataProtectionProvider _provider;

//    public OAuthController(
//        IDataProtectionProvider provider, 
//        IJwtHelper jwtHelper
//        )
//    {
//        _provider = provider;
//        _jwtHelper= jwtHelper;
//    }

//    #region authed 获取code
//    //[Authorize("authed")]
//    ////[HttpGet("/authorize")]
//    //public bool Authorize()
//    //{
//    //    var currentUser = HttpContext.User;

//    //    var result = HttpUtility.ParseQueryString(Request.QueryString.ToString());

//    //    string client_id = "",
//    //        code_challenge = "",
//    //        code_challenge_method = "",
//    //        redirect_uri = "",
//    //        state = "",
//    //        code_verifier = "";

//    //    foreach (var key in result.AllKeys)
//    //    {
//    //        if (key == "client_id") client_id = result[key];
//    //        else if (key == "redirect_uri") redirect_uri = result[key];

//    //        else if (key == "code_verifier") code_verifier = result[key];
//    //        else if (key == "code_challenge") code_challenge = result[key];
//    //        else if (key == "code_challenge_method") code_challenge_method = result[key];

//    //        else if (key == "state") state = result[key];
//    //    }
//    //    // TODO 判断信息的合法性

//    //    // todo oauth可以是用客户端密钥替代
//    //    var protector = _provider.CreateProtector("oauth");

//    //    var code = new AuthCode()
//    //    {
//    //        ClientId = client_id,
//    //        CodeChallenge = code_challenge,
//    //        CodeChallengeMethod = code_challenge_method,
//    //        RedirectUri = redirect_uri,
//    //        iss = User.FindFirst(c => c.Type == "sub")?.Value,
//    //        Expiry = DateTime.Now.AddMinutes(5)
//    //    };
//    //    var codeStr = protector.Protect(JsonSerializer.Serialize(code));
//    //    Response.Redirect($"{redirect_uri}?code={codeStr}&state={state}&iss=liya");
//    //    return true;
//    //} 
//    #endregion

//    #region jwks
//    //[HttpGet]
//    //public async Task<string> jwks()
//    //{

//    //    var jwk = new JsonWebKey
//    //    {
//    //        Kty = "RSA",
//    //        Alg = "RS256",
//    //        Use = "sig", // 或者"enc"取决于你的用途
//    //        Kid = Guid.NewGuid().ToString(), // 通常基于实际应用生成唯一标识符
//    //        E = Base64UrlEncoder.Encode(key.ExportParameters(false).Exponent),
//    //        N = Base64UrlEncoder.Encode(key.ExportParameters(false).Modulus),
//    //    };
//    //    var updatedJson = JsonSerializer.Serialize(new { keys = new[] { jwk } });
//    //    #region 方式二、
//    //    //        string json = @"
//    //    //{
//    //    //  ""keys"": [
//    //    //    {
//    //    //      ""kty"": ""RSA"",
//    //    //      ""use"": ""sig"",
//    //    //      ""kid"": ""your-key-id"",
//    //    //      ""alg"": ""RS256"",
//    //    //      ""n"": ""base64url-encoded-n-modulus"",
//    //    //      ""e"": ""base64url-encoded-e-exponent""
//    //    //    }
//    //    //  ]
//    //    //}";
//    //    //        // 解析 JSON 字符串
//    //    //        JObject jsonObject = JObject.Parse(json);
//    //    //        jsonObject["keys"][0]["kid"] = Guid.NewGuid().ToString();
//    //    //        jsonObject["keys"][0]["e"] = Base64UrlEncoder.Encode(key.ExportParameters(false).Exponent);
//    //    //        jsonObject["keys"][0]["n"] = Base64UrlEncoder.Encode(key.ExportParameters(false).Modulus);
//    //    //        // 将修改后的对象转换回 JSON 字符串
//    //    //        string updatedJson = jsonObject.ToString(); 
//    //    #endregion
//    //    return updatedJson;
//    //} 
//    #endregion

//    #region Token
//    //[HttpPost]
//    //public async Task<AuthToken> Token()
//    //{
//    //    using var bodyReader = new StreamReader(Request.Body);
//    //    var requestBody = await bodyReader.ReadToEndAsync(); // 一次性读取整个正文

//    //    string grantType = "", code = "", redirectUri = "", codeVerify = "", client_id = "", client_secret = "";
//    //    foreach (var part in requestBody.Split('&'))
//    //    {
//    //        var subParts = part.Split('=');
//    //        var key = subParts[0];
//    //        var value = subParts[1];
//    //        if (key == "grant_type") grantType = value;
//    //        else if (key == "code") code = value;
//    //        else if (key == "client_id") client_id = value;
//    //        else if (key == "client_secret") client_secret = value;
//    //        else if (key == "redirect_uri") redirectUri = value;
//    //        else if (key == "code_verifier") codeVerify = value;
//    //    }
//    //    //authorization_code
//    //    var protect = _provider.CreateProtector("oauth");
//    //    var codestr = protect.Unprotect(code);
//    //    var authCode = JsonSerializer.Deserialize<CodeInfoModel>(codestr);

//    //    if (!ValidateCode(authCode, codeVerify))
//    //    {
//    //        return null;
//    //    }

//    //    AuthToken authToken = new AuthToken();

//    //    authToken.id_token = IdGenerator.IdStr();

//    //    authToken.token_type = "Bearer";
//    //    authToken.access_token = IssueToken(authCode.iss);
//    //    authToken.expires_in = DateTime.Now.AddSeconds(120).ToString();

//    //    authToken.refresh_token = _jwtHelper.GenerateRefreshToken(authToken.access_token); ;

//    //    return authToken;

//    //}
//    private bool ValidateCode(CodeInfoModel code, string codeVerfy)
//    {
//        var sha256 = SHA256.Create();
//        var codeVery = Base64UrlEncoder.Encode(sha256.ComputeHash(Encoding.ASCII.GetBytes(codeVerfy)));
//        return codeVery.Equals(code.CodeChallenge);
//    }
//    private string IssueToken(string userId)
//    {
//        return _jwtHelper.CreateToken(new UserVo { Name = "TestUser" },
//            new List<Claim> {
//            new Claim("sub", userId+"",ClaimValueTypes.Integer64)});
//    }
//    #endregion

//    #region RefreshToken
//    //public async Task<AuthToken> RefreshToken(AuthToken authToken)
//    //{

//    //    var jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
//    //    bool isCan = jwtSecurityTokenHandler.CanReadToken(authToken.refresh_token);

//    //    if (!isCan)
//    //    {
//    //        return new();
//    //    }
//    //    var validationParameters = new TokenValidationParameters()
//    //    {
//    //        ValidateIssuer = false,
//    //        ValidateLifetime = true,
//    //        ClockSkew = TimeSpan.FromSeconds(1),

//    //        ValidAudience = "liya00",
//    //        //ValidAudience = "OAuth",
//    //        ValidateIssuerSigningKey = true,
//    //        IssuerSigningKey = new RsaSecurityKey(key)

//    //    };
//    //    SecurityToken securityToken = null;
//    //    try
//    //    {
//    //        jwtSecurityTokenHandler.ValidateToken(authToken.refresh_token, validationParameters, out securityToken);
//    //    }
//    //    catch (Exception ex)
//    //    {
//    //        return new();
//    //    }

//    //    //authToken.id_token = Guid.NewGuid().ToString();

//    //    authToken.expires_in = DateTime.Now.AddSeconds(120).ToString();

//    //    authToken.access_token = IssueToken();
//    //    authToken.refresh_token = IssueToken(60 * 60 * 24);
//    //    authToken.token_type = "Bearer";
//    //    return authToken;
//    //} 
//    #endregion

//    #region Info
//    //[HttpGet]
//    //public async Task<IActionResult> Info()
//    //{
//    //    string content = Request.Headers.Authorization;
//    //    string access_token = content.Split(" ")[1];

//    //    var jwtSecurityTokenHandler = new JwtSecurityTokenHandler();

//    //    (bool IsValid, JsonWebToken Token, TokenValidationResult validationResult) = _jwtHelper.Validate(access_token);

//    //    if (!IsValid)
//    //    {
//    //        return Unauthorized("验证token的格式无效");
//    //    }
//    //    var validationParameters = new TokenValidationParameters()
//    //    {
//    //        ValidateIssuer = false,
//    //        ValidateLifetime = true,
//    //        ClockSkew = TimeSpan.FromSeconds(1),

//    //        ValidateIssuerSigningKey = true,
//    //        ValidAudience = "liya00",
//    //        IssuerSigningKey = new RsaSecurityKey(key)

//    //    };
//    //    SecurityToken securityToken = null;
//    //    try
//    //    {
//    //        jwtSecurityTokenHandler.ValidateToken(access_token, validationParameters, out securityToken);
//    //    }
//    //    catch (Exception ex)
//    //    {
//    //        return Unauthorized("验证失败");
//    //    }

//    //    var payload = access_token?.Split('.')[1];
//    //    if (!string.IsNullOrEmpty(payload))
//    //    {
//    //        var pl = Base64UrlEncoder.Decode(payload);
//    //        var data = JsonDocument.Parse(pl);
//    //        return Ok(JsonSerializer.Serialize(data));
//    //    }
//    //    return Unauthorized("fail");

//    //}
//    #endregion
//}
////public class AuthToken
////{
////    public string id_token { get; set; }
////    public string access_token { get; set; }

////    public string refresh_token { get; set; }

////    public string token_type { get; set; }

////    public string expires_in { get; set; }
////}
////public class AuthCode
////{
////    public string iss { get; set; }
////    public string ClientId { get; set; }
////    public string CodeChallenge { get; set; }
////    public string CodeChallengeMethod { get; set; }
////    public string RedirectUri { get; set; }

////    public DateTime Expiry { get; set; }
////}
